package com.zqh.template.maker;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.zqh.meta.Meta;
import com.zqh.meta.enums.FileGenerateTypeEnum;
import com.zqh.meta.enums.FileTypeEnum;
import com.zqh.template.model.TemplateMakerFileConfig;
import com.zqh.template.model.TemplateMakerModelConfig;
import lombok.var;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;

public class FileMaker {


    /**
     * 生成动态模板文件配置信息
     *
     * @param templateMakerModelConfig 模板模型配置，包含字段替换规则和分组配置
     * @param sourceRootPath           项目源码根路径，用于计算相对路径
     * @param inputFile                输入的模板文件对象
     * @return FilesInfo 包含文件路径、生成类型等配置信息的对象
     */
    public static Meta.FileConfig.FilesInfo makeFileTemplate(TemplateMakerModelConfig templateMakerModelConfig,
                                                             String sourceRootPath,
                                                             File inputFile,
                                                             TemplateMakerFileConfig.FileInfoConfig fileInfoConfig
                                                             ) {
        // 路径规范化处理：统一转换为Unix风格路径并生成输出路径
        String fileInputAbsolutePath = inputFile.getAbsolutePath().replaceAll("\\\\", "/");
        String fileOutputAbsolutePath = fileInputAbsolutePath + ".ftl";


        // 使用Path计算相对路径，确保跨平台兼容性
        Path sourceRoot = Paths.get(sourceRootPath.replaceAll("\\\\", "/"));
        Path inputPath = Paths.get(fileInputAbsolutePath);
        String fileInputPath = sourceRoot.relativize(inputPath).toString().replace("\\", "/");
        String fileOutputPath = fileInputPath + ".ftl";

        // 文件读取策略：优先读取已存在的模板文件，否则读取原始文件
        String fileContent = "";
        boolean hasTemplateFile = FileUtil.exist(fileOutputAbsolutePath);
        try {
            fileContent = hasTemplateFile
                    ? FileUtil.readUtf8String(fileOutputAbsolutePath)
                    : FileUtil.readUtf8String(fileInputAbsolutePath);
            if (fileContent == null) fileContent = "";
        } catch (Exception e) {
            throw new RuntimeException("读取文件失败: " + e.getMessage());
        }

        // 查看分组情况
        var modelGroupConfig = templateMakerModelConfig.getModelGroupConfig();
        boolean isGroup = modelGroupConfig != null; // 判断是否有分组
        String replacement; //需要代替的字符串
        String replacementFormat = isGroup ? "${%s.%s}" : "${%s}"; //格式

        // 执行批量字段替换操作
        String newFileContent = fileContent;
        for (var modelInfoConfig : templateMakerModelConfig.getModels()) {

            // 有分组
            if (isGroup) replacement = String.format(
                    replacementFormat, // 替换格式
                    modelGroupConfig.getGroupKey(), // 组变量
                    modelInfoConfig.getFieldName());
                // 无分组
            else replacement = String.format(
                    replacementFormat, // 替换格式
                    modelInfoConfig.getFieldName());


            newFileContent = StrUtil.replace(newFileContent, modelInfoConfig.getReplaceText(), replacement);
        }

        // 初始化基础配置对象（默认为动态生成类型）
        Meta.FileConfig.FilesInfo filesInfo = Meta.FileConfig.FilesInfo.builder()
                .inputPath(fileOutputPath)
                .outputPath(fileInputPath)
                .type(FileTypeEnum.FILE.getValue())
                .condition(fileInfoConfig.getCondition())
                .generateType(FileGenerateTypeEnum.DYNAMIC.getValue())
                .build();

        // 内容变更处理逻辑 判断有无模板文件，只有无模板文件且无无修改内容，才为静态
        boolean contentChanged = !newFileContent.equals(fileContent);

        if (!hasTemplateFile && !contentChanged) {
            // 首次生成场景处理
            filesInfo.setInputPath(fileInputPath);
            filesInfo.setGenerateType(FileGenerateTypeEnum.STATIC.getValue());

        } else {
            FileUtil.mkParentDirs(fileOutputAbsolutePath);  // 确保目录存在
            FileUtil.writeUtf8String(newFileContent, fileOutputAbsolutePath);
        }

        return filesInfo;
    }


}
